package com.study.kt._04project.encrypt

import java.security.Signature
import java.util.*

/**
 *  非对称加密与消息摘要的组合
 *
 *  应用场景：
 *   1.校验用户身份：使用私钥签名，公钥校验，只要用公钥能校验通过，则该消息一定是私钥持有者发布的
 *   2.校验数据的完整性：用解密后的消息摘要根原文的消息摘要进行对比，例如集成支付宝传入的sign参数可以用来校验数据
 *
 *  数字签名流程：
 *      发送方：
 *       1.对明文进行单向Hash函数(md5、sha等)获取到Hash值
 *       2.使用私钥对Hash值加密 从而生成签名(签名即明文的Hash值的RSA加密)
 *       3.然后将签名、明文一块通过Http发送出去
 *
 *      接收方
 *       1.获取到签名、消息明文
 *       2.使用发送方的公钥对签名解密，生成明文的Hash值
 *       3.对发送方发来的明文进行单向Hash函数
 *       4.明文的Hash与密文解密后的Hash做对比校验，相同则数据正确，不同则数据被篡改
 *
 */
fun main() {
    testSignature()
}

//数据签名与校验
fun testSignature() {
    val privateKey = RSACrypt.privateKey
    val publicKey = RSACrypt.publicKey
    val goodsInfo = "很好的商品"
    //获取数字签名实例对象,通常使用 SHA256withRSA
    val signature = Signature.getInstance("SHA256withRSA")
    //初始化签名
    signature.initSign(privateKey)
    signature.update(goodsInfo.toByteArray())

    //数据签名使用到私钥
    val sign = signature.sign()
    val signArray = Base64.getEncoder().encode(sign)
    val result = String(signArray)
    println(result)

    //数据校验，使用到公钥
    signature.initVerify(publicKey)
    signature.update(goodsInfo.toByteArray())
    //返回true表示校验成功
    //如果用户抓包了篡改了例如价格的数据则校验失败
    val res = signature.verify(Base64.getDecoder().decode(result.toByteArray()))
    println(res)

}
